home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / who.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  2KB  |  97 lines

  1. /* who - see who is logged in            Author: Terrence W. Holm */
  2.  
  3. /*
  4.  *        The user log-in name, terminal port and log-in time
  5.  *        are displayed for all current users, or restricted
  6.  *        to the specified <USER>, <DEVICE> or the current user.
  7.  *
  8.  * Usage:    who
  9.  *        who <USER>
  10.  *        who <DEVICE>
  11.  *        who am i
  12.  *
  13.  * Version:    1.5    01/09/90
  14.  *
  15.  * Author:    Terrence W. Holm    June 1988
  16.  *        revised for UTMP use    Feb 1989
  17.  *
  18.  *        Fred van Kempen, October 1989
  19.  *        Fred van Kempen, December 1989
  20.  *        Fred van Kempen, January 1990
  21.  */
  22.  
  23. #include <sys/types.h>
  24. #include <fcntl.h>
  25. #include <time.h>
  26. #include <utmp.h>
  27. #include <stdio.h>
  28.  
  29. static char *Version = "@(#) WHO 1.5 (01/09/90)";
  30.  
  31. extern char *ttyname();
  32.  
  33. void usage()
  34. {
  35.   fprintf(stderr, "Usage: who [USER | DEVICE | am i]\n");
  36.   exit(-1);
  37. }
  38.  
  39.  
  40. main(argc, argv)
  41. int argc;
  42. char *argv[];
  43. {
  44.   struct utmp entry;
  45.   struct tm *tm;
  46.   char *fmt = "%02.2d:%02.2d:%02.2d";
  47.   char logstr[16], actstr[16];
  48.   char *arg, *sp;
  49.   long login, active;
  50.   int fd, size, found;
  51.  
  52.   switch (argc) {
  53.     case 1:    
  54.         arg = NULL;    break;
  55.     case 2:    
  56.         arg = argv[1];    break;
  57.     case 3:
  58.         if (!strcmp(argv[1], "am") && (!strcmp(argv[2], "i") ||
  59.                        !strcmp(argv[2], "I")))
  60.             arg = ttyname(0) + 5;
  61.         else
  62.             usage();
  63.         break;
  64.     default:
  65.         usage();
  66.   }
  67.  
  68.   size = sizeof(struct utmp);
  69.   found = 0;
  70.   if ((fd = open(UTMP, O_RDONLY)) < 0) {
  71.     fprintf(stderr, "%s: user-accouting is not active.\n", argv[0]);
  72.     exit(0);
  73.   }
  74.   while (read(fd, &entry, size) == size) {
  75.     if (entry.ut_type == USER_PROCESS) {
  76.         if (found == 0) {
  77.             found++;
  78.             printf("USER     LINE       TIME     ACTIVE   PID\n");
  79.         }
  80.         login = entry.ut_time;
  81.         tm = localtime(&login);
  82.         sprintf(logstr, fmt, tm->tm_hour, tm->tm_min, tm->tm_sec);
  83.         time(&active);
  84.         active -= login;
  85.         tm = localtime(&active);
  86.         sprintf(actstr, fmt, tm->tm_hour, tm->tm_min, tm->tm_sec);
  87.         printf("%-8.8s %-8.8s %-8.8s  %-8.8s  %d\n",
  88.                entry.ut_name, entry.ut_line, logstr,
  89.                actstr, entry.ut_pid);
  90.     }
  91.   }
  92.   close(fd);
  93.   if (found == 0) printf("No active users.\n");
  94.  
  95.   exit(0);
  96. }
  97.